<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // trim去除字符串两边空格(只能去除2边，不能去除中间的)
    var str = " andy   ";
    console.log(str.trim());
    console.log("===========================");

    // 用于获取对象自身所有的属性，Object.keys 遍历对象属性
    var obj = {
        id: 1,
        pname: '小米',
        price: 1999,
        num: 2000
    };
    var arr = Object.keys(obj);
    console.log(arr);
    arr.forEach(function (value) {
        console.log(value);
    });

    console.log("===========================");
    // Object.defineProperty() 定义新属性或修改原有的属性
    var obj = {
        id: 1,
        pname: '小米',
        price: 1999
    };
    // 1. 以前的对象添加和修改属性的方式
    // obj.num = 1000;
    // obj.price = 99;
    // console.log(obj);
    // 2. Object.defineProperty() 定义新属性或修改原有的属性
    Object.defineProperty(obj, 'color', {
        value: 1000,
        // enumerable: true
        configurable: true
    });
    Object.defineProperty(obj, 'color', {
        value: 2334,
        // enumerable: true
    });
    console.log(Object.keys(obj));
    console.log(obj);
    obj.color = 2333;
    console.log("-----------------------------");
    Object.defineProperty(obj, 'price', {
        value: 9.9
    });
    // delete obj.price;            // 是可以进行删除操作的，虽然configurable 默认为false,但这里并没有定义
    obj.price = 312;              // 是可以进行修改操作的，虽然configurable 默认为false,但这里并没有定义
    console.log(obj);
    console.log("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    Object.defineProperty(obj, 'id', {
        // 如果值为false 不允许修改这个属性值 默认值也是false
        writable: false,   // writable 的不能再次赋值是对于 obj.num = 1000 这种方式而言的，但是再次使用 defineProperty是可以修改值的,只是writable如果不重新定义还是会延用上一次的false
    });
    obj.id = 2;
    console.log(obj);
    Object.defineProperty(obj, 'id', {
        value : 122,
        // writable: true
    });
    obj.id = 123;
    console.log(obj);
    console.log("**********************************");
    Object.defineProperty(obj, "id", {
        value: 3,             // writable默认为false，如果不写就是这个值默认不允许修改
        writable: true
    });
    obj.id = 5;
    console.log(obj);
    Object.defineProperty(obj, "id", {
        value: 6,             // writable默认为false，如果不写就是这个值默认不允许修改
        writable: false,   // 这里没有配置configurable还是可以删除这个id的
    });
    delete obj.id;
    console.log(obj);

    console.log("==========================");

    Object.defineProperty(obj, "id", {
        value: 6,             // writable默认为false，如果不写就是这个值默认不允许修改
        writable: false,
        configurable: false  // 写上之后就不能删了,
    });
    delete obj.id;
    console.log(obj);

    // 不允许，因为上面已经写了configurable: false，会抛出异常Cannot redefine property
    // Object.defineProperty(obj, "id", {
    //     value: 8,             // writable默认为false，如果不写就是这个值默认不允许修改
    //     writable: true,
    //     configurable: true  // 写上之后就不能删了
    // });
    // delete obj.id;
    // console.log(obj);

    // Mark:只要在上面定义了 configurable:false,后面就不能再次定义该对象的这个属性了
    Object.defineProperty(obj, "id", {
        value: 100,             // writable默认为false，如果不写就是这个值默认不允许修改
        // configurable: false  // 写上之后就不能删了
    });
    delete obj.id;
    console.log(obj);

    // 总结：c中的定义，是对于外侧的 obj.price = 100 ,delete obj.price, Object.keys(obj) 而言的,configurable是对于defineProperty和外侧都有约束
    // 对于传统定义的对象的属性，他的 writable,configurable,enumerable属性都是true,对于使用defineProperty新增加的属性，他的writable,configurable,enumerable属性都是false

</script>
</body>
</html>